# OC面试题 - 分类(Category)与类拓展(extension)

## 分类和类拓展的区别

相同点:两者都是在一个类上面拓展属性或者方法

不通点:

- 1.<b>分类本身不会创建一个存储属性</b>,只会调用`set`、`get`,这本身是没用的,要添加一个真正能存储值得属性,需要Runtime的关联对象,或者用其它的全局值来代替
- 2.加载方式,`拓展(extension)`只能说把.h的内容写到了.m里面,加载方式和写在.h并没有区别,而<b>分类则是编译的时候利用循环把原有的方法,属性,协议等添加到原类对应的数组里面</b>(值得注意的是,如果同名会覆盖掉原来的函数,因为插入步骤很复杂,但最终结果是分类的方法在前面) 
- 3.使用场景不同,`拓展(extension)`只是把.h的东西写在了.m里面,这么写的目的是因为.m在非拓展的情况下无法通过简单的方式定义一个成员属性,导致很多不需要暴露的成员属性都暴露给了导入这个.h的类,所以这个一般是自定义的

分类则是给系统类添加一些实现方式,或者第三方组件的拓展,强行用拓展给这些类拓展实测会报错

<b>拓展的局限在于不能给第三方类的拓展添加实现</b>
